// 日志文件 - 很有用

#pragma once

#include <iostream>
#include <cassert>
#include <cstdarg>
#include <cerrno>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <cstring>
#include <string>
#include <unordered_map>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define DEBUG   0
#define NOTICE  1
#define WARNING 2
#define FATAL   3

const char* log_level[] = {"DEBUG", "NOTICE", "WARNING", "FATAL"};


// 日志函数
void logMessage(int level/*日志等级*/, const char* format/*格式*/, .../*可变参数*/)
{
    assert(level >= DEBUG);
    assert(level <= FATAL);

    char* name = getenv("USER"); // 获取用户信息

    char logInfo[1024];

    va_list ap; // char* 定义可以访问可变参数部分的变量
    va_start(ap, format); // 使ap指向可变参数部分
    vsnprintf(logInfo, sizeof(logInfo) - 1, format, ap); // 将格式化输出的内容写入到logInfo中
    va_end(ap); // ap = nullptr;

    FILE* out = (level == FATAL) ? stderr : stdout;

    fprintf(out, "%s | %u | %s | %s\n", log_level[level], \
        (unsigned int)time(nullptr), \
        name == nullptr ? "unknow" : name, logInfo);
}

